package com.mo.tools.enums;

import org.springframework.util.ObjectUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @description: IEnum
 * @author: Xingfu.Yang
 * @date: 2024/1/2 14:21
 */
public interface IEnum<T> {
    T getCode();

    String getDesc();


    /**
     * 检查枚举是否存在
     *
     * @param code
     * @param enumClass
     * @param <T>
     * @return
     */
    static <T> boolean checkEnum(T code, Class<? extends IEnum> enumClass) {
        if (null == code) {
            return false;
        }
        IEnum[] enums = enumClass.getEnumConstants();
        for (IEnum iEnum : enums) {
            if (iEnum.getCode().equals(code)) {
                return true;
            }
        }
        return false;
    }


    /**
     * 根据code获取描述
     *
     * @param code
     * @param enumClass
     * @param <T>
     * @return
     */
    static <T> String getDesc(T code, Class<? extends IEnum> enumClass) {
        if (ObjectUtils.isEmpty(code)) {
            return null;
        }
        IEnum[] enums = enumClass.getEnumConstants();
        for (IEnum iEnum : enums) {
            if (iEnum.getCode().equals(code)) {
                return iEnum.getDesc();
            }
        }
        return null;
    }

    /**
     * 根据编码获取枚举
     *
     * @param code
     * @param enumClass
     * @param <T>
     * @return
     */
    static <T> IEnum getEnumByCode(T code, Class<? extends IEnum> enumClass) {
        if (code == null) {
            return null;
        }
        IEnum[] enumConstants = enumClass.getEnumConstants();
        for (IEnum iEnum : enumConstants) {
            if (iEnum.getCode().equals(code)) {
                return iEnum;
            }
        }
        return null;
    }

    /**
     * 根据描述获取枚举
     *
     * @param desc
     * @param enumClass
     * @param <T>
     * @return
     */
    static <T extends IEnum> T getEnumByDesc(String desc, Class<T> enumClass) {

        if (desc == null) {
            return null;
        }

        T[] enums = enumClass.getEnumConstants();
        for (T iEnum : enums) {
            if (iEnum.getDesc().equals(desc)) {
                return iEnum;
            }
        }
        return null;
    }

    /**
     * 获取枚举所有编码
     *
     * @param clazz
     * @param <T>
     * @return
     */
    static <T> List<T> getAllEnumCode(Class<? extends IEnum> clazz) {
        IEnum[] enums = clazz.getEnumConstants();
        List<T> codeList = new ArrayList<>();
        for (IEnum e : enums) {
            codeList.add((T) e.getCode());
        }
        return codeList;
    }

    /**
     * 获取所有枚举描述
     *
     * @param clazz
     * @return
     */
    static List<String> getAllEnumDesc(Class<? extends IEnum> clazz) {
        IEnum[] enums = clazz.getEnumConstants();
        List<String> descList = new ArrayList<>();
        for (IEnum e : enums) {
            descList.add(e.getDesc());
        }
        return descList;
    }


    /**
     * 获取枚举map
     *
     * @param clazz
     * @return
     */
    static Map<String, String> getMap(Class<? extends IEnum> clazz) {
        IEnum[] enums = clazz.getEnumConstants();
        Map<String, String> map = new HashMap<>();
        for (IEnum e : enums) {
            map.put(String.valueOf(e.getCode()), e.getDesc());
        }
        return map;
    }


}


